package com.zmn.oms.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zmn.common.utils.http.HttpUtil;
import com.zmn.common.utils.map.Point;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * 类描述: 百度地图
 *
 * @author liuying
 * @date 2018/12/25 8:31 PM
 */
public class BaiduMapUtil {
    //private static final Logger logger = LoggerFactory.getLogger(BaiduMapUtil.class);
    // 单点驾车导航距离
    //public final static String DRIVING_URL = "http://api.map.baidu.com/direction/v2/driving";
    // 多点摩托导航距离-废弃
    //private final static String MULTI_MOTORCYCLE_URL = "http://api.map.baidu.com/routematrix/v2/motorcycle";
    // 多点骑行导航距离
    //public final static String MULTI_RIDING_URL = "http://api.map.baidu.com/routematrix/v2/riding";
    //private static long akCount = 0;
    //private static long webAkCount = 0;

    /**
     * 正/逆地理编码服务
     */
    //private static String LOCATION_URL = "https://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s";

    /**
     * 2021.1.13 调整为三个账号，每个平台一个账号，仅限页面上使用
     */
    @Deprecated
    public static final String[] WEB_AKS = {
//            "Lh3Dt8AlQaStSKDldLdG0a5q",
//            "o3s1Xsxh7RGhKIGDCD0ruQ7pUTAWHBXD",
//            "G1Zl6aksZvhig9rv57trqQpPEtRWFYyx",
//            "42M0ERTjXNIsXYEdVjKIEXQnvgBvWAtP",
//            "ONiYp5fblpKbXiOuuSyRvWNIAkeiGe7x",
//            "7tQVF9go5MayoaUrRhdTGvv2s16hBHRM",
//            "dlHU41UgpHE4iALnVpwawatx2W2m3u3s",
//            "jz9sqbRWEyaVpe37V1yCpii0BM3RKXb7",
//            "SrTH2vkwUIDaG9OWYEXC5IdX2PcxzM9V"
    };

    private static long webAkCount = 0;

    /**
     * 获取百度 ak， 仅限页面上使用
     * @return
     */
    @Deprecated
    public static String getWebAk() {
//        String webAk = WEB_AKS[(int) (webAkCount % WEB_AKS.length)];
//        webAkCount++;
//        if (webAkCount < 0) {
//            webAkCount = 0;
//        }
//        return webAk;
        // 2022-03-10分配
        return "Lh3Dt8AlQaStSKDldLdG0a5q";
    }

    /*
    private static String[] aks = {
            "LUGeoHYpHFaI1pz57ddgkPQu", "LSaLSeetLsfsp5HN0mClQkzl", "FwprNDRsvfQ9Ey03dvVGP8QG",
            "KFQi5aius8VHpxWpE143BXs2", "SIUhMixNpQcEmf17hPTMnb1U", "Z18KtSrH0EGOWSEjeYhZBXUT",
            "5s1FesvngkGuNrQX4fOZgqhi", "iLVF3SZpPWABoV45FZ6o9KKk",
            // 2020.12.01 新增
            "wdSbxEMyq6GrovGt7YD3PGoYq8LijMqI",
            "eZfngPkvfmIayL3rF8kdvPn3dZBc3l7C",
            "jMle2WEBdZgsIzepSa5VQAkM1ad6WUA4",
            "PfhRhwRxaax8O0LQX4vA9m1vTlp673QF",
            "TyC76AsKXwRhGu7EWzsbDib4qjeGrelH",
            "6uM5Y0PwfMLtQlnrBZ1dTGbrAQ5ml90L",
            "RUhkPNS4zni0uosecl1qkOpgiGfxZyto",
            "FMAM04zj6sRTvdRPCfPC1vIKv6ERfsZR",
            "qQgNtujwCkkkk4OcmHbMIPEsmGWl79rB",
            "AVGlLnW0pjes7vxDrEwDQ7gvG1YjwF0r"
            };
            */

//    private static String[] API_AKS = {
//            // 2021.1.8 调整为三个账号，每个平台一个账号
////            "1UVeg0PV8rbsbIPONeRhHaF7BgYLccit",
////            "FwprNDRsvfQ9Ey03dvVGP8QG",
////            "AVGlLnW0pjes7vxDrEwDQ7gvG1YjwF0r"
//
//            // 最后一次分配
//            "FwprNDRsvfQ9Ey03dvVGP8QG",
//            "AVGlLnW0pjes7vxDrEwDQ7gvG1YjwF0r",
//            "WmH39KbBtDHSE0d5lqd1IfvP5lXnWMa2",
//            "LV5076l5VRCRImCT3HqLqrqNnPEkwcSu",
//            "8Trekw5ko4rsKlIsrgG6ZjM2yyjKxVYk"
//
//    };

//    public static String getAk() {
//        String ak = API_AKS[(int) (akCount % API_AKS.length)];
//
//        akCount++;
//        if (akCount < 0) {
//            akCount = 0;
//        }
//
//        return ak;
//    }

//    /**
//     * 反查经纬度
//     * @see com.zmn.oms.zmn.business.impl.baidumap.BaiduMapBServiceImpl#location(java.lang.String)
//     * @param address
//     * @return
//     */
//    @Deprecated
//    public static Location locatin(String address) {
//        String res = null;
//        try {
//            String encodeAddress = URLEncoder.encode(address, "UTF-8");
//            res = HttpUtil.get(String.format(LOCATION_URL, encodeAddress, getAk()));
//            JSONObject obj = JSON.parseObject(res);
//            if (obj.getInteger("status") == 0) {
//                JSONObject locObj = obj.getJSONObject("result").getJSONObject("location");
//                Location locaion = new Location();
//                locaion.setLat(locObj.getString("lat"));
//                locaion.setLng(locObj.getString("lng"));
//                return locaion;
//            }
//        } catch (Exception e) {
//            logger.error(e.getMessage(), e);
//        }
//        return null;
//    }
//
//    /**
//     * 获取导航距离（开车），单位米
//     * @see com.zmn.oms.zmn.business.impl.baidumap.BaiduMapBServiceImpl#getNavigationDistance
//     * @param originPoint
//     * @param descPoint
//     * @return
//     */
//    @Deprecated
//    public static Integer getNavigationDistance(Point originPoint, Point descPoint) {
//        // 不走高速
//        String tactics = "3";
//        /*
//         * 0：默认 3：不走高速 4：高速优先 5：躲避拥堵 6：少收费 7：躲避拥堵&高速优先 8：躲避拥堵&不走高速 9：躲避拥堵&少收费
//         * 10：躲避拥堵&不走高速&少收费 11：不走高速&少收费
//         */
//        String url = String.format("%s?origin=%s,%s&destination=%s,%s&tactics=%s&ak=%s", DRIVING_URL, originPoint.getLat(), originPoint.getLng(), descPoint.getLat(), descPoint.getLng(), tactics, BaiduMapUtil.getAk());
//        logger.info("导航距离请求：" + url);
//
//        try {
//            String res = HttpUtil.get(url);
//            JSONObject jsonObject = JSON.parseObject(res);
//
//            // 0：成功 1：服务内部错误 2：参数无效 7：无返回结果
//            String successStatus = "0";
//            if (successStatus.equals(jsonObject.getString("status"))) {
//                Integer distance = jsonObject.getJSONObject("result").getJSONArray("routes").getJSONObject(0).getInteger("distance");
//                return distance;
//            } else {
//                logger.error("导航距离返回失败=>" + res);
//            }
//        } catch (Exception e) {
//            logger.error(e.getMessage(), e);
//        }
//
//        return null;
//    }
//
//    /**
//     * 多点获取骑行距离，单位米
//     * @see com.zmn.oms.zmn.business.impl.baidumap.BaiduMapBServiceImpl#getMultiRidingDistance
//     * @param originPoint
//     * @param descPointList
//     * @return
//     */
//    @Deprecated
//    public static List<Integer> getMultiRidingDistance(Point originPoint, List<Point> descPointList) {
//        if (CollectionUtils.isEmpty(descPointList)) {
//            return null;
//        }
//
//        int maxSize = 50;
//
//        // 由于百度批量算路接口单次调用50个的限制，小于等于50个，直接计算
//        if (descPointList.size() <= maxSize) {
//            return getMultiRidingDistanceLimit50(originPoint, descPointList);
//        }
//
//        // 大于50个，分段计算
//        List<Integer> resList = new ArrayList<>(descPointList.size());
//
//        // 最后一个分段大小
//        int lastSegmentSize;
//        // 余数
//        int remainder = descPointList.size() % maxSize;
//
//        if (remainder == 0) {
//            lastSegmentSize = maxSize;
//        }
//        else {
//            lastSegmentSize = remainder;
//        }
//
//        // 分段大小
//        int segmentSize;
//
//        // 分批调用百度接口
//        for (int i = 0; i < descPointList.size(); ) {
//
//            // 最后一个分段
//            if (i == descPointList.size() - 1) {
//                segmentSize = lastSegmentSize;
//            }
//            else {
//                segmentSize = maxSize;
//            }
//
//            List<Point> ptList = new ArrayList<>(segmentSize);
//            for (int j = 0; j < segmentSize && i < descPointList.size(); i++, j++) {
//                ptList.add(descPointList.get(i));
//            }
//
//            List<Integer> disList = getMultiRidingDistanceLimit50(originPoint, ptList);
//            // 调用失败一次即全部失败
//            if (disList == null) {
//                return null;
//            }
//
//            resList.addAll(disList);
//        }
//
//        return resList;
//    }
//
//    /**
//     * 多点获取骑行距离，单位米（限50个）
//     *
//     * @param originPoint
//     * @param descPointList
//     * @return
//     */
//    private static List<Integer> getMultiRidingDistanceLimit50(Point originPoint, List<Point> descPointList) {
//        StringBuilder sb = new StringBuilder();
//        sb.append(String.format("%s?output=json&origins=%s,%s&destinations=", MULTI_RIDING_URL, originPoint.getLat(), originPoint.getLng()));
//        int i = 0;
//
//        for (Point pt : descPointList) {
//            // 百度批量算路接口一次最多处理50个
//            if (i >= 50) {
//                break;
//            }
//
//            if (i > 0) {
//                sb.append("%7C");
//            }
//
//            sb.append(String.format("%s,%s", pt.getLat(), pt.getLng()));
//            i++;
//        }
//
//        sb.append(String.format("&ak=%s", BaiduMapUtil.getAk()));
//        String url = sb.toString();
//        //logger.info("多点导航距离请求：" + url);
//
//        try {
//            String res = HttpUtil.get(url);
//            //logger.info("多点导航距离请求结果：" + res);
//            JSONObject jsonObject = JSON.parseObject(res);
//
//            // 0：成功 其他：错误
//            String successStatus = "0";
//            if (jsonObject != null && successStatus.equals(jsonObject.getString("status"))) {
//                List<Integer> resList = new ArrayList<>(descPointList.size());
//                JSONArray array = jsonObject.getJSONArray("result");
//
//                if (array == null) {
//                    logger.error("多点导航距离返回结果为空");
//                    return null;
//                }
//
//                if (array.size() < descPointList.size()) {
//                    logger.error("多点导航距离返回结果数量不匹配=>" + array.size());
//                    return null;
//                }
//
//                for (i = 0; i < array.size(); i++) {
//                    resList.add(array.getJSONObject(i).getJSONObject("distance").getInteger("value"));
//                }
//
//                return resList;
//            } else {
//                logger.error("多点导航距离返回失败=>" + res);
//            }
//        } catch (Exception e) {
//            logger.error(e.getMessage(), e);
//        }
//
//        return null;
//    }
//
//    public static class Location {
//        private String lng;
//        private String lat;
//
//        public String getLng() {
//            return lng;
//        }
//
//        public void setLng(String lng) {
//            this.lng = lng;
//        }
//
//        public String getLat() {
//            return lat;
//        }
//
//        public void setLat(String lat) {
//            this.lat = lat;
//        }
//    }
//
//    public static void main(String[] args) {
//        Point p1 = new Point();
//        p1.setLat(40.014832);
//        p1.setLng(116.357383);
//
//        List<Point> list = new ArrayList<Point>(5);
//        for (int i = 0; i < 50; i++) {
//            Point p2 = new Point();
//            p2.setLat(p1.getLat() + 0.0001 * i);
//            p2.setLng(p1.getLng() + 0.0001 * i);
//            list.add(p2);
//        }
//
//        list.get(0).setLat(29.634129);
//        list.get(0).setLng(106.496758);
//
//        long startTime = System.currentTimeMillis();
//        List<Integer> resList = BaiduMapUtil.getMultiRidingDistance(p1, list);
//        long EndTime = System.currentTimeMillis();
//
//        System.out.println(EndTime - startTime);
//        if (resList != null) {
//            System.out.println(resList.size());
//        }
//
//        System.out.println(resList);
//    }
}
